package com.ican.util;

import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;

import com.ican.common.BusinessException;

public class DateUtils {
	/**yyyy-MM-dd hh:mm:ss*/
	public final static String FULL_PATTERN = "yyyy-MM-dd hh:mm:ss";
	/**yyyy-MM-dd HH:mm:ss*/
	public final static String FULL_PATTERN_24 = "yyyy-MM-dd HH:mm:ss";
    /**yyyy-MM-dd hh:mm*/
	public final static String DATEHHMM_PATTERN = "yyyy-MM-dd hh:mm";
	/**yyyy-MM-dd HH:mm*/
    public final static String DATEHHMM_PATTERN_24 = "yyyy-MM-dd HH:mm";
    /**yyyy-MM-dd*/
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**yyyyMMdd*/
    public final static String DATE_PATTERN_2 = "yyyyMMdd";
    /**hh:mm:ss*/
    public final static String TIME_PATTERN = "hh:mm:ss";
    /**HH:mm:ss*/
    public final static String TIME_PATTERN_24 = "HH:mm:ss";
    /**yyyy年MM月dd日H时mm分ss秒*/
    public final static String FULL_PATTERN_ZH = "yyyy年MM月dd日H时mm分ss秒";
    /**yyyyMMddHHmmssSSS*/
    public final static String FULL_PATTERN_SSS = "yyyyMMddHHmmssSSS";
    
	/**
	 * 时间字符串转化成 Date
	 * @param dateStr 时间字符串
	 * @param dateFormat 时间字符串格式，如：yyyy-MM-dd HH:mm:ss
	 * @return Date  返回日期
	 * @exception 参数为空、转换异常
	 */
	public static Date toDate(String dateStr, String dateFormat) throws BusinessException {
		SimpleDateFormat df = new SimpleDateFormat(dateFormat);
		try {
			return df.parse(dateStr);
		} catch (Exception e) {
			throw new BusinessException("把时间" + dateStr + "转换成如下格式" + dateFormat + "时出错！", e);
		}
	}
	
	/**
	 * 时间字符串转化成 Calendar
	 * @param dateStr 时间字符串
	 * @param dateFormat 时间字符串格式，如：yyyy-MM-dd HH:mm:ss
	 * @return Calendar  返回日期
	 * @exception 参数为空、转换异常
	 */
	public static Calendar toCalendar(String dateStr, String dateFormat) throws BusinessException {
		Date temp = toDate(dateStr, dateFormat);
		Calendar cal = Calendar.getInstance();
		cal.setTime(temp);
		return cal;
	}
	
	/**
	 * 时间转化成字符串
	 * @param date 时间，null为当前时间
	 * @param dateFormat 时间字符串格式，如：yyyy-MM-dd HH:mm:ss
	 * @return String  返回日期字符串
	 */
	public static String DatetoString(Date date, String dateFormat) {
		date = date == null ? new Date() : date;
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		return sdf.format(date);
	}
	
	/**
	 * 时间计算
	 * @param date 时间，null为当前时间
	 * @param field 对哪个属性进行计算；1：年；2：月；3：日；4：小时；5：分钟
	 * @param amount 要增加的值
	 * @return Date  返回日期
	 */
	public static Date addTime(Date date, int field, int amount) {
		date = date == null ? new Date() : date;
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		if(field == 1){
			cal.add(Calendar.YEAR, amount);
		}else if(field == 2){
			cal.add(Calendar.MONTH, amount);
		}else if(field == 3){
			cal.add(Calendar.DATE, amount);
		}else if(field == 4){
			cal.add(Calendar.HOUR, amount);
		}else if(field == 5){
			cal.add(Calendar.MINUTE, amount);
		}
		return cal.getTime();
	}
	
	/**
	 * 取得特殊时间
	 * @param date 时间，null为当前时间
	 * @param field 特殊标志；1：本年第一个月；2：本年最后一个月；3：本月第一天；4：本月最后一天
	 * @return Date  返回日期
	 */
	public static Date getSpecialDate(Date date, int field) {
		date = date == null ? new Date() : date;
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		if(field == 1){//取得本年第一个月
			cal.set(Calendar.MONTH, 0);
		}else if(field == 2){//取得本年最后一个月
			cal.set(Calendar.MONTH, 11);
		}else if(field == 3){//取得本月第一天
			cal.set(Calendar.DATE, 1);
		}else if(field == 4){//取得本月最后一天
			cal.set(Calendar.DATE, 1);
			cal.add(Calendar.MONTH, 1);
			cal.set(Calendar.DATE, -1);
		}
		return cal.getTime();
	}
	
	/**
	 * 两个时间之间的天数
	 * @param date1  起始时间
	 * @param date2  结束时间
	 * @return day  两个时间间的天数  (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000)
	 */
	public static long daysBetweenTwoDate(Date date1, Date date2) {
		return (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000);
	}
	
	/**
     * 两个时间之间的小时数
     * @param date1  起始时间
     * @param date2  结束时间
     * @return hour  两个时间间的小时数  (date1.getTime() - date2.getTime()) / (60 * 60 * 1000)
     */
    public static long hoursBetweenTwoDate(Date date1, Date date2) {
        return (date1.getTime() - date2.getTime()) / (60 * 60 * 1000);
    }
	
//	public static void main(String[] args) {
//		Date date1 = new Date();
//		Date date2 = getSpecialDate(date1,3);
//		System.out.println(hoursBetweenTwoDate(date1, date2));
//	}
}
